Sprachbestandteile von VBA
In diesem Kapitel werden vorgestellt:
|
Wir wollen in diesem Kapitel einen geordneten Überblick über das geben, was VBA ausmacht. Als Ausgangspunkt wollen wir wieder unser kleines VBA-Programm verwenden:
Sub Hauptprozedur() Wert1=5 Wert2=12 Produkt=Wert1 * Wert2 End Sub
Was Sie hier sehen, heißt in VBA eine "Prozedur".
Prozeduren
Eine Prozedur ist eine selbständige Einheit von Anweisungen, die ("Argumente") erhalten, eine Reihe von Anweisungen ausführen und die Werte der übergebenen Argumente ändern kann. Die Prozedur ist die kleinste selbständige Einheit eines VBA-Programmes. Sie beginnt mit dem Text
Sub
plus einem Namen. Dieser Name darf auf einem Modulblatt nur ein einziges Mal zum Bezeichnen einer Prozedur verwendet werden.
Am Ende jeder Prozedur steht die Zeile
End Sub
die VBA anzeigt, daß die Prozedur hier aufhört. In der nächsten Zeile kann eine weitere Prozedur beginnen.
Zwischen Beginn und Ende einer Prozedur befinden sich jene Codezeilen, in denen VBA wirklich "arbeitet", die sogenannten "Anweisungen".
Syntax
[Private | Public][Static] Sub Name [(ArgListe)] [Anweisungen] [Exit Sub] [Anweisungen] End Sub
Elemente
Die Sub-Anweisung besteht aus folgenden Teilen:
Teil | Beschreibung |
Public | Auf die Sub-Prozedur kann von allen anderen Prozeduren in allen Modulen zugegriffen werden. Bei Verwendung in einem privaten Modul (mit einer Option Privat-Anweisung) kann auf die Prozedur nur innerhalb des Projekts zugegriffen werden. |
Private | Auf die Sub-Prozedur kann nur durch andere Prozeduren aus dem Modulblatt zugegriffen werden, in dem steht. |
Static | Die lokalen Variablen der Sub-Prozedur bleiben zwischen Aufrufen erhalten. Das Attribut Statisch wirkt sich nicht auf Variablen aus, die außerhalb der Sub-Prozedur deklariert wurden, auch wenn sie in der Prozedur verwendet werden. |
Name | Name der Sub-Prozedur, gemäß den Standardkonventionen für Namen von Variablen. |
ArgListe | Variablenliste mit den Argumenten, die an die Sub-Prozedur beim Aufruf übergeben werden. Mehrere Variablen werden durch Beistriche getrennt. |
Anweisungen | Eine beliebige Gruppe auszuführender Anweisungen im Rumpf der Sub-Prozedur. |
Die Syntax für das Argument ArgListe ist:
[[Optional][ByVal | ByRef][ParamArray] Variablenname[( )] As Typ]
Die ArgListe besteht aus folgenden Teilen:
Teil | Beschreibung |
Optional | Ein Argument muß nicht angegeben werden. Alle im Anschluß an
Optional in ArgListe angegebenen Argumente müssen auch optional sein und
mit dem Schlüsselwort Optional deklariert werden. Alle als Optional
angegebenen Argumente müssen den Typ Variant haben. Optional kann
überhaupt nicht verwendet werden, wenn ArgumentListe verwendet wird.
Hinweis In Ihrem Code können Sie mithilfe der Funktion IsMissing() überprüfend, ob ein optionales Argument übergeben worden ist. |
ByVal | Das Argument wird als Wert übergeben. |
ByRef | Das Argument wird als Referenz übergeben. |
ParamArray | Ist nur als letztes Argument in ArgListe zulässig und gibt an, daß das letzte Element ein als Optional deklariertes Datenfeld mit Variant-Elementen ist. Das Schlüsselwort ParamArray erlaubt die Angabe einer variablen Anzahl von Argumenten und darf nicht in Kombination mit den Schlüsselwörtern ByVal, ByRef oder Optional verwendet werden. Ein Beispiel dafür auf Seite 25. |
Variablenname | Name der Variablen, die das Argument repräsentiert, gemäß den Standardkonventionen für Namen von Variablen. |
Typ | Datentyp des an die Prozedur zu übergebenden Arguments. Zulässige Typen sind Boolean, Integer, Long, Currency, Single, Double, Date, String (nur Zeichenfolgen variabler Länge), Object, Variant, ein benutzerdefinierter Typ oder ein Objekttyp. |
Aufruf
Der Aufruf einer Sub-Prozedur erfolgt durch Angabe des Prozedurnamens, gefolgt von der Argumentliste. Es empfiehlt sich aber, das Befehlswort "Call" vor den Prozedurnamen zu setzen-so weiß man immer, daß man eine Prozedur aufruft, und nicht ein VBA-Objekt.
Sub AufrufendeProzedur() Call AusgabeImTestfenster("Hallo Welt") End Sub Sub AusgabeImTestfenster(sText) Debug.Print sText End Sub
Hinweis In der VBA-Hilfe finden Sie unter "Call" genauere Informationen zum Aufrufen von Sub-Prozeduren.
Beispiel für "Argumentliste"
Sub HauptProzedur() iEingabe = 20 Call TochterProzedur(iEingabe, "Guten Morgen") End Sub Sub TochterProzedur(iText, sGrussformel) End Sub
iEingabe: Zahl, deren Adresse im Computer-Speicher an die Variable "iText" in der Tochterprozedur weitergegeben wird. Wird "iZahl" verändert, so ändert auch "iEingabe" seinen Wert. ("Übergabe per Referenz".)
Guten Morgen: Da keine Variable, sondern ein Text, wird an "sGrussformel" der Text weitergegeben. ("Übergabe als Wert".)
Übergabe als Wert erzwingen
Variable und Datenfelder werden immer per Referenz übergeben, es sei denn, Sie ordnen die Übergabe als Wert an.
Sub TochterProzedur(byVal iText, sGrussformel) End Sub
"ByVal" wird vor de Namen der Variablen in der auffangenden Prozedur gestellt. Damit geht der Zusammenhang zwischen "iEingabe" und "iText" verloren. Änderungen des Wertes von "iText" haben auf den Wert von "iEingabe" keine Auswirkung mehr.
Anmerkungen
Sub-Prozeduren sind standardmäßig Public, wenn sie nicht explizit mit Private festgelegt werden. Wird Static nicht angegeben, so bleiben die Werte lokaler Variablen zwischen den Aufrufen nicht erhalten.
Der gesamte ausführbare Code muß sich in Prozeduren befinden. Innerhalb einer Sub-Prozedur kann keine weitere Sub-Prozedur definiert werden.
Die Anweisung "Exit Sub" führt zum unmittelbaren Verlassen einer Sub-Prozedur. Die Programmausführung wird mit der Anweisung fortgesetzt, die auf die Anweisung mit dem Aufruf der Sub-Prozedur folgt. "Exit Sub"-Anweisungen können beliebig oft an beliebigen Stellen innerhalb einer Sub-Prozedur verwendet werden.
Im Gegensatz zu einer Function-Prozedur (die einen Wert zurückgibt) kann eine Sub-Prozedur nicht in einem Ausdruck verwendet werden.
Nicht möglich: Variable = Call EineProzedur Argument:=, ...
Möglich: Variable = EineFunktion (Argument:=, ...)
Variablen in Sub-Prozeduren können entweder explizit deklariert oder ohne Deklaration verwendet werden. Explizit (über Dim) in einer Prozedur deklarierte Variablen sind innerhalb dieser Prozedur immer lokal. Andere Variablen, die in einer Prozedur verwendet, aber dort nicht deklariert werden, sind auch lokal, sofern sie nicht bereits explizit auf einer höheren Ebene außerhalb der Prozedur deklariert wurden.
Vorsicht Eine Prozedur kann eine nicht explizit in der Prozedur deklarierte Variable zwar verwenden, aber es kann zu Namenskonflikten kommen, falls ein anderes auf Modulebene definiertes Element denselben Namen hat. Verwendet Ihre Prozedur eine nicht deklarierte Variable mit einem Namen, der dem Namen einer anderen Prozedur, Konstanten oder Variablen (auf Modulebene) entspricht, so wird die Variable als Referenz auf den Namen interpretiert, der auf Modulebene definiert wurde.
Hinweis Deklarieren Sie Variablen, um solche Konflikte zu vermeiden. Mit der Anweisung Option Explicit am Beginn eines Modulblattes oberhalb der ersten Prozedur können Sie die explizite Deklaration von Variablen erzwingen:
Option Explicit Sub ErsteProzedur Dim ... ... End Sub
Nicht bekannte Zahl von Argumenten übergeben
Angenommen, Sie können während des Programmierens nicht wissen, viewiele Argumente eine Prozedur zur Laufzeit des Programmes empfangen wird. In diesem Fall müssen Sie diese Argumente in einem Variant-Datenfeld als "Argumentliste" übergeben. Die Prozedur muß dann selbst die Anzahl und Bedeutung der Argumente herausfinden. Ein Beispiel:
Sub HauptProzedur() zeingabe = 20 Call TochterProzedur(zeingabe, "Guten Morgen", "Guten Abend") End Sub Sub TochterProzedur(ParamArray AuffangendesDatenfeld()) For zähler = LBound(AuffangendesDatenfeld) _ To UBound(AuffangendesDatenfeld) MsgBox AuffangendesDatenfeld(zähler) Next End Sub
Das Gleiche gilt für Funktionen.
Die VBA-Hilfe gibt eine vollständige Darstellung aller Aspekte des Verwendens von Prozeduren in VBA. Suchen Sie zunächst den Index-Eintrag "Prozedur" und wählen Sie dann aus den angebotenen Themen "Prozedur-Anweisung". |
Funktionen
Eine Funktion ist eine selbständige Einheit von Anweisungen, die Argumente erhalten, eine Reihe von Anweisungen ausführen und die Werte der übergebenen Argumente ändern kann. Sie entspricht damit einer Prozedur, allerdings mit drei Unterschieden:
Im Gegensatz zu einer Sub-Prozedur kann eine Funktions-Prozedur auf der rechten Seite eines Ausdrucks verwendet werden. Dadurch läßt sich der Rückgabewert der Funktions-Prozedur genau so weiter verarbeiten wie der Rückgabewert einer integrierten Funktion, zum Beispiel Wurzel, Cos oder Zn. Der Rückgabewert wird durch Zuweisung an den Namen der Funktion bereitgestellt.
Der Aufruf einer Funktions-Prozedur innerhalb eines Ausdrucks erfolgt durch Angabe des Funktionsnamens, gefolgt von der Argumentliste in Klammern. Die Klammern müssen auch dann angegeben werden, wenn die Funktion keine Argumente hat.
Resultat=Funktionsprozedur () Resultat=Funktionsprozedur (Arg1, ... Argn) Function Wochennummer(Prüfdatum As Date) As Variant Dim ErsterJänner As Long ErsterJänner = DateSerial(Year(Prüfdatum), 1, 1) Wochennummer = Prüfdatum - ErsterJänner + WeekDay(ErsterJänner) - 2 Wochennummer = Fix(Wochennummer / 7 + 1) End Function
Diese Funktion berechnet die Wochennummer eines übergebenen Datums. Das Datum kann als Datumszahl, als Text oder als Bezug auf eine Zelle, die ein Datum enthält, eingegeben werden. Und so wird diese Funktion eingesetzt:
LaufendeWoche = Wochennummer("4. April 1994")
Die folgende Übersicht zeigt Ihnen den grundsätzlichen Aufbau einer VBA-Funktion.
Syntax
[Public | Private][Static] Function Name [(ArgListe)][As Typ] [Anweisungen] [Name = Ausdruck] [Exit Function] [Anweisungen] [Name = Ausdruck] End Function
Elemente
Die Function-Anweisung besteht aus folgenden Teilen:
Teil | Beschreibung |
Public | Die Funktion kann in jedem Modulblatt eines Projektes angesprochen werden.. |
Private | Auf die Funktions-Prozedur kann nur durch andere Prozeduren aus dem Modul zugegriffen werden, in dem sie selbst steht. |
Static | Alle innerhalb der Funktion geschaffenen (lokalen) Variablen behalten nach Abarbeiten der Funktion ihren Wert bei |
Name | Name der Funktion, gemäß den Standardkonventionen für Namen von Variablen. |
ArgListe | Variablenliste mit den Argumenten, die an die Funktions-Prozedur beim Aufruf übergeben werden. Mehrere Variablen werden durch Beistriche voneinander getrennt. |
Typ | Datentyp des an die Prozedur zu übergebenden Arguments. Zulässige Typen sind Boolean, Integer, Long, Currency, Single, Double, Date, String (nur Zeichenfolgen variabler Länge), Object, Variant, ein benutzerdefinierter Typ oder ein Objekttyp. Datenfelder lassen sich (unabhängig von ihrem Typ) nicht zurückgeben, bei Variant-Werten, die ein Datenfeld enthalten, ist dies jedoch möglich. |
Anweisungen | Eine beliebige Gruppe auszuführender Anweisungen im Rumpf einer Funktions-Prozedur. |
Ausdruck | Rückgabewert der Funktion. |
Die Syntax für das Argument ArgListe ist:
[Optional][ByVal | ByRef][ParamArray] Variablenname[( )][As Typ]
Die Teile von ArgListe sind:
Teil | Beschreibung |
Optional | Ein Argument muß nicht angegeben werden. Alle im Anschluß an Optional in ArgListe angegebenen Argumente müssen auch optional sein und mit dem Schlüsselwort Optional deklariert werden. Alle als Optional angegebenen Argumente müssen den Typ Variant haben. Optional kann nicht verwendet werden, wenn ParamArray verwendet wird. |
ByVal | Das Argument wird als Wert übergeben. |
ByRef | Das Argument wird als Referenz übergeben. |
ParamArray | Ist nur als letztes Argument in ArgListe zulässig und gibt an, daß das letzte Element ein als Optional deklariertes Datenfeld mit Variant-Elementen ist. Das Schlüsselwort ParamArray erlaubt die Angabe einer variablen Anzahl von Argumenten und darf nicht in Kombination mit den Schlüsselwörtern ByVal, ByRef oder Optional verwendet werden. Ein Beispiel dafür wurde bereits auf Seite 25 gegeben. |
Variablenname | Name der Variablen, die das Argument repräsentiert, gemäß den Standardkonventionen für Namen von Variablen. |
Typ | Datentyp des an die Prozedur zu übergebenden Arguments. Zulässige Typen sind Boolean, Integer, Long, Currency, Single, Double, Date, String (nur Zeichenfolgen variabler Länge), Object, Variant, ein benutzerdefinierter Typ oder ein Objekttyp. |
Rückgabe des Funktionsergebnisses
Funktionen berechnen etwas und stellen das Ergebnis der Berechnung dem Programm zur Verfügung. Innerhalb der Funktion müssen Sie das Rechenergebnis einer Variablen zuweisen, die den Namen der Funktions-Prozedur hat. Solche Zuweisungen sind beliebig oft an beliebigen Stellen innerhalb der Funktion möglich. Wenn dem Funktionsnamen kein Wert zugewiesen wurde, liefert die Funktion einen Standardwert: Eine numerische Funktion liefert 0, eine Zeichenfolgenfunktion liefert eine leere Zeichenfolge (""), und eine Funktion mit dem Rückgabetyp Variant liefert "Empty" ("Leer"). Eine Funktion, die eine Objektreferenz zurückgibt, liefert "Nothing" ("Nichts"), wenn dem Funktionsnamen (unter der Verwendung der Anweisung "Set") innerhalb der Funktion keine Objektreferenz zugewiesen wurde.
Ein Beispiel dafür auf Seite 26.
Die VBA-Hilfe gibt eine vollständige Darstellung aller Aspekte des Verwendens von Funktionen in VBA. Suchen Sie zunächst den Index-Eintrag "Funktion" und wählen Sie dann aus den angebotenen Themen "Funktion-Anweisung". |
Gültigkeitsbereich von Prozeduren und Funktionen
Prozeduren und Funktionen sind standardmäßig Öffentlich, wenn sie nicht explizit mit Privat festgelegt werden. Wird (zusätzlich) Statisch angegeben, so bleiben die Werte lokaler Variablen zwischen den Aufrufen der Funktion oder Prozedur erhalten.
Hinweis Damit Sie sicher auf Prozeduren und Funktionen in fremden Arbeitsmappen zugreifen können, müssen Sie in der Arbeitsmappe, in der Sie diese aufrufen, einen "Verweis" eintragen. Sie erreichen das Dialogfeld "Verweise" über das Menü "EXTRAS", Befehl "Verweise...". Dieser Befehl ist nur sichtbar, wenn ein Modulblatt aktiv ist!
Anweisungen
Eine Anweisung ist die kleinste Einheit von Code und Operatoren, die eine Aktion, Definition oder Deklaration ermöglichen. Beispiele dafür sind:
Wert1=5 |
Zuweisung eines Wertes an eine Variable |
Produkt=Wert1*Wert2 |
Multiplikation zweiter Werte mit Hilfe des Operators "*"; Zuweisung des Ergebnisses an eine Variable |
x=Application.Max(5,12) |
Aufruf der EXCEL-Funktion "Max"; Übergabe zweier Werte; Zuweisung des Ergebnisses an eine Variable |
Open "TESTDAT.XLS" |
Anweisung, die Datei zu öffnen |
Unterprozedur Wert1, Wert2 |
Starten einer Prozedur und Übergabe von zwei Werten an diese |
y=MeineFunktion(a,b,c) |
Aufrufen einer Funktion und Übergabe von drei Werten an diese; Zuweisen des Ergebnisses der Berechnungen innerhalb der Funktion an eine Variable |
DIM MeineVariable As Integer |
Deklaration eines Variablennamens und Zuweisen eines Datentyps an die Variable |
Mehrere Anweisungen pro Zeile Dies ist zwar schlechter Programmierstil, weil es Code unübesichtlich macht, es ist aber möglich, wenn Sie nach jeder Anweisung einen Doppelpunkt setzen.
Wert1 = 5: Wert2 = 8: Produkt = Wert1 * Wert2
Anweisungen, die wegen ihrer Länge mehr als eine Zeile Code brauchen Setzen Sie an das Ende jeder Zeile, in der Sie die Anweisung nicht zu Ende schreiben konnten, ein Leerzeichen gefolgt von einem Unterstrich.
Unterprozedur Wert1, _ Wert2
Variablen und Datentypen
In den Beispielen zum Abschnitt "Anweisungen" haben wir den Begriff "Variable" kennengelernt. Was ist das eigentlich?
Eine Variable ist eine Speicherstelle im Computer, die Daten aufnehmen kann, die von einem VBA-Programm erfragt und auch geändert werden können. Jede Variable hat einen eindeutigen Namen, der sie innerhalb ihres Gültigkeitsbereiches identifiziert. Die Namen von Variablen müssen mit einem Buchstaben beginnen; sie dürfen keine Leerzeichen enthalten:
Falsch: 5Zeilen Meine Variable
Richtig: Fünf_Zeilen MeineVariable
Die folgende Tabelle enthält die von Visual Basic unterstützten Datentypen sowie deren Speicherbedarf und Wertebereiche.
Datentyp | Speicherbedarf | Bereich |
Boolean | 2 Bytes | True oder False (Zahl <>0 oder 0) |
Integer | 2 Bytes | -32.768 bis 32.767. |
Long(lange Ganzzahl) | 4 Bytes | -2.147.483.648 bis 2.147.483.647. |
Single (Gleitkommazahl mit einfacher Genauigkeit) | 4 Bytes | -3,402823E38 bis -1,401298E-45 für negative Werte. 1,401298E-45 bis 3,402823E38 für positive Werte. |
Double (Gleitkommazahl mit doppelter Genauigkeit) | 8 Bytes | -1,79769313486232E308 bis -4,94065645841247E-324 für negative Werte. 4,94065645841247E-324 bis 1,79769313486232E308 für positive Werte. |
Currency (skalierte Ganzzahl) | 8 Bytes | -922.337.203.685.477,5808 bis 922.337.203.685.477,5807. |
Date (für Datum und Zeit) | 8 Bytes | 01. Januar 100 bis 31. Dezember 9999. |
Object | 4 Bytes | Beliebiger Verweis auf ein Objekt. |
String (Zeichenfolge) | 1 Byte pro Zeichen | 0 bis ca. 2 Milliarden (ca. 65.535 in Microsoft Windows, Version 3.1 und niedriger) |
String*Anzahl | Maximal Anzahl von Zeichen | |
Variant | 16 Bytes + 1 Byte für jedes Zeichen | Numerische Werte im Bereich des Datentyps Doppelt oder ein beliebiger Text. |
Benutzerdefiniert (mit Typ) | Anzahl ist von den Elementen abhängig | Der Bereich für jedes Element entspricht dem Bereich des zugehörigen Datentyps. |
Deklaration und Gültigkeitsbereich von Variablen
Lokal-Nur in einer Prozedur oder Funktion sichtbar Wenn Sie eine Variable in einer Prozedur erzeugen:
Variable=Wertzuweisung
oder gleich unterhalb des Prozedur- oder Funktionskopfes ausdrücklich einrichten:
Sub EineProzedur() Dim Variable End Sub
dann ist diese Variable "lokal", das heißt, Sie ist nur in dieser Prozedur "sichtbar". Verläßt Ihr Programm die Prozedur, wird die Variable im Computerspeicher gelöscht. Sie können aber festlegen, daß Ihre Variable in mehr als einer Prozedur sichtbar und ansprechbar ist.
Privat-In allen Prozeduren und Funktionen eines Modulblattes sichtbar wird eine Variable dann, wenn Sie sie am Beginn des Modulblattes-noch vor dem Beginn der ersten Prozedur-mit einer "Private"-Anweisung deklarieren:
Private Variable as Integer Sub Hauptprozedur() Variable=Wertzuweisung Ende Sub
Wird der Modul verlassen, wird die Variable im Computerspeicher gelöscht.
Wird in einer Prozedur oder Funktion eine Variable deklariert, die den selben Namen hat wie eine private Variable im selben Modulblatt, dann "verbirgt" diese Variable den Blick auf die modulweit gültige.
Private TagesDatum as Integer Sub Hauptprozedur() Dim TagesDatum as Date Variable=Wertzuweisung Ende Sub
Die in "Hauptprozedur" geschaffene Variable "TagesDatum" hat mit der modulweit geschaffenen nichts zu tun. Die modulweit geschaffene Variable ist in "Hauptprozedur" aber nicht mehr sichtbar.
Öffentlich-In allen Prozeduren und Funktionen eines Projekts sichtbar, solange das zugehörige VBA-Programm läuft ist eine Variable dann, wenn Sie sie am Beginn eines Modulblattes-noch vor dem Beginn der ersten Prozedur-mit einer "Public"-Anweisung deklarieren:
Public Variable As Integer Sub Hauptprozedur() Variable=Wertzuweisung Ende Sub
Wird auf Modulebene eine gleichnamige Variable definiert, dann "verbirgt" diese Variable im ganzen Modulblatt den Blick auf die projektweit gültige. Wird in einer Prozedur oder Funktion eine gleichnamige Variable deklariert, dann "verbirgt" diese Variable den Blick auf eine gleichnamige modulweit oder projektweit gültige.
Ein "Projekt" umfaßt sämtlichen Code in sämtlichen Modulblättern, die für ein VBA-Programm angelegt worden sind.
Statische Variable
Mit der Anweisung Statisch in einer Funktion oder Prozedur deklarierte Variable behalten ihren Wert, solange das VBA-Programm läuft.
Static Username as String
Syntax
[Dim | Private | Public] Variablenname[([Indizes])][As Typ]
Elemente
Die Deklarations-Anweisung einer Variablen besteht aus folgenden Teilen:
Teil | Beschreibung |
Variablenname | Name der Variablen, gemäß den Standardkonventionen für Namen von Variablen. |
Indizes | Bei Datenfelder die Anzahl der Element-Dimensionen und der Elemente pro Dimension. |
Typ | Datentyp der Variablen. Boolean, Integer, Long, Currency, Single, Double, Date, String, String * Anzahl (für Zeichenfolgen fester Länge), Object, Variant, ein anderer benutzerdefinierter Typ oder ein Objekttyp. |
Anmerkungen
Wenn Sie keinen Daten- oder Objekttyp angeben, erhält die Variable standardmäßig den Datentyp Variant. Dieser Variablentyp kann Werte aller Datentypen und Verweise auf alle Objekttypen enthalten. Er braucht den meisten Speicherplatz und wird langsamer abgearbeitet als eine Variable, die einen konkreten Datentyp (String, Integer, Double, Date etc.) oder Objekttyp (Workbook, Range, Menubar etc.) hat.
Bei der Initialisierung wird numerischen Variablen der Wert 0 und Zeichenfolgen variabler Länge eine leere Zeichenfolge zugewiesen. Zeichenfolgen fester Länge werden mit Nullen aufgefüllt und Variant-Variablen werden mit Leer initialisiert. Alle Elemente einer Variablen mit einem benutzerdefinierten Typ werden genauso initialisiert wie Variablen entsprechenden Datentyps. Einer Variablen mit einer Referenz auf ein Objekt muß mit der Setze-Anweisung ein existierendes Objekt zugewiesen werden, bevor sie verwendet werden kann. Eine deklarierte Objektvariable hat vor dem Zuweisen eines Objekts den speziellen Wert Nothing, der anzeigt, daß die Variable auf kein Objekt verweist.
Hinweis Wenn Sie die Dim-Anweisung innerhalb einer Prozedur verwenden, sollten Sie sie an den Anfang der Prozedur stellen. Somit bleibt sie gut sichtbar.
Datenfelder
Datenfelder sind eine besondere Art von Variablen. Sie sind eine Menge aufeinanderfolgender indizierter (das heißt mit einer fortlaufender Nummer ansprechbarer) Elemente mit einem gemeinsamen Datentyp. Wenn Sie wollen, daß die einzelnen Elemente eines Datenfeldes verschiedene Datentypen aufnehmen können, dann deklarieren Sie das Datenfeld als Typ "Variant". Jedes Datenfeldelement wird durch eine eindeutige Indexnummer gekennzeichnet. Änderungen an einem Element bleiben ohne Wirkung auf die anderen Elemente. Datenfelder werden mit der "Dim"-, "Private" - oder "Public"-Anweisung deklariert.
Syntax
Dim Variablenname[([Indizes])][As Typ]
Indizes bestimmen die Dimensionen einer Datenfeldvariablen. Bis zu 60 Dimensionen gleichzeitig sind zulässig. Die Syntax für das Argument Indizes ist:
[Untergrenze To] Obergrenze [,[Untergrenze To] Obergrenze]
Die Anweisung "Option Base"
Das erste Element eines Datenfeld erhält standardmäßig den Index 0. Das ist oft unpraktisch-zum Beispiel, weil es in Tabellen weder Spalte noch Zeile 0 gibt. Mit der Anweisung
Option Base 1
am Beginn eines Modulblattes erreichen Sie, daß alle Datenfelder, die in diesem Modul geschaffen werden, als ersten Index 1 haben.
Beispiele
STARRE ANZAHL VON ELEMENTEN
Wenn Sie ein Datenfeld deklarieren und gleichzeitig die Anzahl seiner Elemente festlegen, dann kann die Größe des Datenfeldes während des Programmlaufes nicht verändert werden.
TagFeld ist ein Datenfeld mit Variant-Werten und 51 indizierten Elementen von 0 bis 50, vorausgesetzt, Option Base wurde für das aktuelle Modul auf 0 (Voreinstellung) gesetzt.
Dim TagFeld(50)
Matrix ist ein zweidimensionales Datenfeld mit ganzen Zahlen.
Dim Matrix(3,4) As Integer
TestMatrix ist ein dreidimensionales Datenfeld mit Werten vom Typ Double und explizit angegebenen Grenzen.
Dim TestMatrix(1 To 5, 4 To 9, 3 To 5) As Double
Geburtstag ist ein Datenfeld mit Datumsangaben und Indizes von 1 bis 10.
Dim Geburtstag(1 To 10) As Date
DYNAMISCHES FESTLEGEN DER ELEMENTEZAHL
Die Dim- , Private- oder Public-Anweisung in Kombination mit einem leeren Klammernpaar dient der Deklaration dynamischer Datenfelder. Nach einer solchen Deklaration können Sie mit der Redim-Anweisung innerhalb einer Prozedur die Anzahl der Dimensionen und Elemente definieren. Wenn Sie eine Dimension für eine Datenfeldvariable mit einer weiteren Deklaration ändern wollen und die Größe des Datenfelds bereits explizit mit einer Dim- , Private- oder Public-Anweisung festgelegt wurde, tritt ein Fehler auf.
Beispiele
TestFeld ist ein dynamisches Datenfeld. Es wird-ohne Festlegung der Zahl der Elemente-so deklariert:
Dim TestFeld() As Integer
Später wird im Code dann (innerhalb einer Prozedur oder Funktion) die Anzahl der Elemente festgelegt:
Redim TestFeld(5) ' 5 Elemente reservieren. For I = 1 To 5 ' 5 Schleifendurchläufe. TestFeld(I) = I ' Datenfeld initialisieren. Next I
Die folgende Anweisung ändert die Größe des Datenfelds und löscht die übernommenen (d.h. die ersten fünf) Elemente.
Redim TestFeld(10) ' Größe auf 10 Elemente ändern. For I = 1 To 10 ' 10 Schleifendurchläufe. TestFeld(I) = I ' Datenfeld initialisieren. Next I
' Die nächste Anweisung ändert die Größe des Datenfelds, löscht die Elemente aber nicht.
Redim Preserve TestFeld(15) ' Größe auf 15 Elemente ändern.
Gültigkeitsbereich von Datenfeldern
Datenfelder, die mit "Public" auf Modulebene deklariert wurden, stehen allen Prozeduren und Funktionen in allen Modulen zur Verfügung. Datenfelder, die mit "Private" auf Modulebene deklariert wurden, stehen allen Prozeduren des Moduls zur Verfügung. Auf Prozedur- oder Funktionsebene deklarierte Datenfelder stehen nur innerhalb der sie umgebenden Prozedur oder Funktion zur Verfügung.
Wenn Sie keinen Datentyp angeben, erhält das Datenfeld standardmäßig den Datentyp Variant.
Bei der Initialisierung wird numerischen Datenfeldelementen der Wert 0 und Zeichenfolgen variabler Länge eine leere Zeichenfolge zugewiesen. Zeichenfolgen fester Länge werden mit Nullen aufgefüllt und Variant-Variablen werden mit "Empty" initialisiert.
Die "Array"-Funktion
Liefert einen Variant mit einem Datenfeld.
Syntax
Variant=Array(ArgListe)
ArgListe enthält eine durch Beistriche getrennte Liste mit einer unbestimmten Anzahl von Werten, die dem im Variant enthaltenen Datenfeld als Elemente zugewiesen werden. Werden keine Argumente angegeben, so erstellt die Funktion ein Datenfeld mit der Länge Null.
Dim A As Variant A = Array(10,20,30) B = A(2)
Hinweis Die untere Grenze für ein mit der Datenfeld-Funktion erstelltes Datenfeld ist durch die "Option Base"-Anweisung festgelegt. Gilt auf dem Modulblatt "Option Base 1" so enthält A(2) den Wert 20, bei "Option Base 0" den Wert 30.
Anmerkungen
Obwohl sich ein Variant mit einem darin enthaltenen Datenfeld konzeptionell von einem Datenfeld mit Elementen des Typs Variant unterscheidet, wird auf die Datenfeldelemente in derselben Weise zugegriffen. Der Zugriff auf ein Element eines Datenfelds erfolgt durch Angabe des Variablennamens mit einem nachfolgenden Klammernpaar, das die Indexzahl des gewünschten Elements enthält. Im vorangehenden Beispiel erstellt die erste Anweisung die Variable A als einen Variant. Die zweite Anweisung weist der Variablen A ein Datenfeld zu. Die letzte Anweisung verdeutlicht, wie das zweite Datenfeldelement einer anderen Variablen zugewiesen werden kann.
Liegt in "Tabelle1" ein zweitspaltiger Zellbereich vor, der in jeder Spalte eine Liste enthält:
und ordnen wir mittels VBA an:
Sub try() Dim vNamensEinträge As Variant vNamensEinträge = ThisWorkbook.Sheets("Tabelle1"). _ Cells(1, 1).CurrentRegion End Sub
so enthält der Variant "vNamensEinträge" ein zweidimensionales Datenfeld mit den Inhalten der Spalten des Zellbereiches:
Wert von Spalte "A" in Zeile "1" erfragen Dazu schreiben wir:
MsgBox vNamensEinträge(1,1)
Und bei der Frage nach dem Wert von Spalte "B" in Zeile "1":
MsgBox vNamensEinträge(1,2)
Anzahl der Elemente erfragen Die Zahl der Elemente 1. Ordnung (=Anzahl der Datenzeilen in der Tabelle) erfragen wir so:
MsgBox "Anzahl der Datenzeilen= " & UBound(vNamensEinträge)
Und die Anzahl der Elemente 2. Ordnung pro Element erster Ordnung so:
MsgBox "Anzahl der Datenspalten= " & UBound(vNamensEinträge, 2)
Hinweis Das niedrigste Element eines mit einem Zellbereich gefüllten Datenfeld-Variants ist immer Eins, auch wenn "Option Base 0" angeordnet wurde.
Den Code dieses Beispiels finden Sie im Verzeichnis "Beispiel" in der Datei "VARIANT.XLS". |
Konstanten
Während Variable und Datenfelder ihre Werte ändern können, während ein VBA-Programm läuft, behalten Konstante ihren Wert unabänderlich. Jeder Versuch, ihnen einen neuen Wert zu geben, führt zu einer Fehlermeldung und zum Abbruch des Programmes.
Deklaration von Konstanten
Innerhalb einer Prozedur werden Konstante so eingerichtet:
Sub MeineProzedur() Const DATUMS_SPALTE=1 ... End Sub
Auf Modulebene richten Sie Konstante ein, indem Sie sie noch vor dem Beginn der ersten Prozedur oder Funtion mit dem Befehlswort "Private" deklarieren. Diese Konstanten sind dann in allen Prozeduren und Funktionen auf dem Modulblatt bekannt. Richten Sie in einer Prozedur oder Funktion eine gleichnamige Konstante ein, dann "vebirgt" diese die modulweit deklarierte:
Private Const DATUMS_SPALTE=1 Sub MeineProzedur() Cells(7, DATUMS_SPALTE).Select End Sub
Global sichtbar ist eine Konstante dann, wenn Sie sie auf irgendeinem Modulblatt eines Projektes noch vor dem Beginn der ersten Prozedur oder Funtion mit dem Befehlswort "Public" deklarieren. Diese Konstanten sind dann in allen Prozeduren und Funktionen auf allen Modulblättern bekannt. Richten Sie auf einem Modulblatt eine private gleichnamige Konstante ein, so "verbirgt" sie gegenüber allen Funktionen und Prozeduren auf diesem Blatt die projektweit deklarierte. Richten Sie in einer Prozedur oder Funktion eine gleichnamige Konstante ein, dann überdeckt diese innerhalb der Prozedur oder Funktion die globale Konstante.
Public Const HOECHSTGRENZE=1000 Sub MeineProzedur() If iEinWert > HOECHSTGRENZE Then ... End Sub
Hinweis Es hat sich eingebürgert, den Namen von Konstanten ausschließlich mit Großbuchstaben zu schreiben. Sie fallen damit in einem Codetext deutlich auf und es ist jederzeit klar, daß es sich nicht um eine Variable handelt.
Variablen werden üblicherweise mit Groß- und Kleinbuchstaben geschrieben.
Operatoren
Operatoren leisten die Arbeit, die VBA mit Werten oder Objekten durchführt. Wir unterscheiden:
Arithmetische Operatoren
* | Multiplikation |
/ | Division |
+ | Addition |
- | Subtraktion |
\ | Division mit ganzzahligem Ergebnis; Nachkommastellen werden abgeschnitten |
^ | Potentieren |
Mod | Liefert den Rest des gerundeten Ergebnisses einer Division |
Logische Operatoren
Eqv | Übereinstimmung zweier Ausdrücke |
Imp | Logische Implikation zweier Ausdrücke |
Not | Logische Verneinung eines Ausdruckes |
Or | Entweder-Oder oder beide zweier Ausdrücke |
And | Logische Gleichheit zweier Ausdrücke |
Xor | Logische Ausschließung zweier Ausdrücke |
Vergleichsoperatoren
Syntax
Ergebnis = Ausdruck1 VergleichsOperator Ausdruck2 Ergebnis = Objekt1 Is Objekt2 Ergebnis = Zeichenfolge Like Muster
Elemente
Vergleichsoperatoren bestehen aus den folgenden Teilen:
Teil | Beschreibung |
Ergebnis | Beliebige numerische Variable |
Ausdruck | Beliebiger Ausdruck |
VergleichsOperator | Beliebiger Vergleichsoperator |
Objekt1 | Beliebiger Objektname |
Objekt2 | Beliebiger Objektname |
Zeichenfolge | Beliebiger Zeichenfolgenausdruck |
Muster | Beliebiger Zeichenfolgenausdruck oder Bereich von Zeichen |
Die Operatoren Is und Like haben eine spezielle Bedeutung. Is untersucht, ob zwei Objekt-Variable auf das selbe Objekt zeigen (funktioniert in EXCEL 5.0 nicht).
Sub try() Set Testobjekt = ThisWorkbook.Sheets(1) Set Testobjekt3 = Application.Toolbars Set TestObjekt2 = Testobjekt ' Objektverweise zuweisen. Set TestObjekt4 = Testobjekt Set TestObjekt5 = Testobjekt3 EinTest = TestObjekt2 Is TestObjekt4 ' Liefert Wahr. EinTest = TestObjekt5 Is TestObjekt4 ' Liefert Falsch. EinTest = Testobjekt Is TestObjekt5 ' Liefert Falsch. End Sub
Like gibt an, ob eine Zeichenfolge in einer anderen enthalten ist.
EinTest = "aBBBa" Like "a*a" ' Liefert Wahr. EinTest = "F" Like "[A-Z]" ' Liefert Wahr. EinTest = "F" Like "[!A-Z]" ' Liefert Falsch. EinTest = "a2a" Like "a#a" ' Liefert Wahr. EinTest = "aM5b" Like "a[L-P]#[!c-e]" ' Liefert Wahr. EinTest = "BAT123khg" Like "B?T*" ' Liefert Wahr. EinTest = "CAT123khg" Like "B?T*" ' Liefert Falsch.
Hinweis Beim Vergleich von deutschen Zeichenfolgen, die Umlaute enthalten, sowie von Zeichenfolgen, in denen einmal Großschreibung und das andere Mal Kleinschreibung vorliegt, liefert "Like" nur dann das richtige Ergebnis, wenn am Beginn des Modulblattes noch vor der ersten Prozedur oder Funktion "Option Compare Text" angeordnet wird.
Verkettungsoperatoren
+ | Hängt zwei Zeichenketten aneinander; addiert zwei Zahlen |
& | Hängt zwei Zeichenketten aneinander; wandelt Zahl in Zeichenkette um |
Objekte
VBA ist "objektorientiert", aber was heißt das konkret? Alles, was wir in EXCEL sehen, bestimmen, ändern, hinzufügen oder löschen können, sind "Objekte", die Eigenschaften haben und mit Methoden manipuliert werden können.
Mehr über Objekte im nächsten Kapitel des Skriptums.
Gültigkeitsbereich von Objekten
Objekte sind global sichtbar. Mehr über sie in den folgenden beiden Kapiteln.
Schlüsselwörter nach Aufgabenbereichen
In der VBA-Hilfe wird eine ausführliche Übersicht über alle Schlüsselwörter dieser Programmiersprache gegeben. Viele Hyptertext-Verknüpfungen machen Ihnen die Hilfeseiten zu den einzelnen Schlüsselwörtern zugänglich.
Die Schlüsselwörter-Übersicht finden Sie in der EXCEL-Online-Hilfe zu EXCEL 5.0 unter "Inhalt der Microsoft EXCEL-Hilfe"-"Programmieren mit Visual Basic"-"Schlüsselwörter nach Aufgabenbereichen", in der Hilfe zu EXCEL 7.0 im Register "Suchen" des Hilfe-Dialogfeldes nach Eingabe des Suchbegriffes "Schlüsselwörter". |
Copyright © by JOANNEUM RESEARCH Forschungsgesellschaft mbH |